#include <iostream>
#include <functional>
using namespace std;
using placeholders::_1;
using placeholders::_2;
using placeholders::_3;

void fun(int a, int b, int c)
{
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}

int main()
{
    auto f = bind(fun, _1, 5, _2); // 给第二个参数设置初值5

    //函数调用
    f(10, 20);
    return 0;
}

// int main()
// {
//     auto f = bind(fun, _1, _3, _2); // 包装fun函数

//     //函数调用
//     f(10, 20, 30);
//     return 0;
// }

// #include <iostream>
// #include <functional>
// using namespace std;

// using placeholders::_1;
// using placeholders::_2;
// using placeholders::_3;

// int fun(int a, int b)
// {
    
// }

// int main()
// {
//     auto f = bind(fun, _1, _2);
//     cout << f(1, 2) << endl;
//     return 0;
// }

// class A
// {
// public:
//     A(int n, int m)
//         :_n(n)
//         , _m(m)
//     {}
//     void Print()
//     {
//         cout << _n + _m << endl;
//     }
// private:
//     int _n;
//     int _m;
// };

// int main()
// {
//     A a(1, 2);
//     function<void(A*)> f = &A::Print; // 包装成员函数Print

//     f(&a); // 调用时传入对象地址

//     function<void(A)> f2 = &A::Print; 
//     f2(a);

//     function<void(A&)> f3 = &A::Print;
//     f3(a);

//     function<void(A&&)> f4 = &A::Print;
//     f4(move(a));
//     return 0;
// }

// //函数
// int f1(int a, int b)
// {
//     return a + b;
// }

// //仿函数
// struct F2
// {
//     int operator()(int a, int b)
//     {
//         return a - b;
//     }
// }f2; 

// //lambda表达式
// auto f3 = [](int a, int b)->int{ return a * b; };

// int main()
// {
//     //定义包装器，其接收的可调用对象，参数为两个int，返回值为int
//     function<int(int, int)> f;

//     //使用包装器调用可调用对象
//     f = f1; // 接收函数
//     cout << f(3, 5) << endl;

//     f = f2; // 接收仿函数对象
//     cout << f(3, 5) << endl;

//     f = f3; // 接收lambda表达式
//     cout << f(3, 5) << endl;
//     return 0;
// }